package com.wnxy.sddfp.sms.config;

import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.profile.DefaultProfile;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

/**
 * 短信发送工具类
 */
@Slf4j
@Component
public class SmsUtil {
    @Value("${aliyun.sms.signName}")
    private String signature;
    @Value("${aliyun.sms.templateCode}")
    private String templateCode;
    @Value("${aliyun.sms.accessKey}")
    private String accessKeyId;
    @Value("${aliyun.sms.secret}")
    private String accessKeySecret;

    /**
     * 发送短信验证码。
     * 通过阿里云短信服务，向指定的手机号码发送验证码。
     *
     * @param phoneNumbers 手机号码，支持批量发送，多个号码用英文逗号分隔。
     * @param code         需要发送的验证码内容。
     * @return 返回发送结果的响应码。
     */
    public String sendSms(String phoneNumbers, String code) {
        // 初始化阿里云短信服务的客户端
        // 这里需要修改发送短信的ID和密码
        DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
        IAcsClient client = new DefaultAcsClient(profile);

        // 设置发送短信的请求参数
        SendSmsRequest request = new SendSmsRequest();
        request.setSysRegionId("cn-hangzhou"); // 设置地域ID
        request.setPhoneNumbers(phoneNumbers); // 设置目标手机号码
        request.setSignName(signature); // 设置短信签名
        request.setTemplateCode(templateCode); // 设置短信模板代码
        request.setTemplateParam("{\"code\":\"" + code + "\"}"); // 设置短信模板参数，这里主要是验证码内容

        try {
            // 发送短信并获取响应
            SendSmsResponse response = client.getAcsResponse(request);

            // 记录发送短信的请求ID和业务ID，以及响应码和消息，用于日志记录和问题排查
            log.info("\n请求ID:" + response.getRequestId() + "\n业务ID：" + response.getBizId()
                    + "\n响应码：" + response.getCode() + "\n响应消息：" + response.getMessage());

            // 返回发送结果的响应码
            return response.getCode();
        } catch (ClientException e) {
            // 如果发送过程中出现异常，抛出运行时异常，上层调用者可以捕获并处理
            throw new RuntimeException(e);
        }
    }

}
